﻿using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http.Headers;
using System.Reflection.Emit;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Lesson5_泛型
{
    #region 获得原始数据类型
    class Type
    { 
        public void GetInt(int i)
        {
            Console.WriteLine(i.GetType());
        }


        public void GetDouble(double d)
        { { Console.WriteLine(d.GetType()); } }

        public void GetType(object b)
        {
            Console.WriteLine(b.GetType());
        }

    }

    #region  优化获取数据原始类型的方法
    class Rget<T>
    {
    public static void Get<T>(T t)   
        {
            Console.WriteLine(t.GetType());   //数值元素t的原始类型
        }
    }




    #endregion
    #endregion


    
    //
    #region 知识点一 泛型实现了类型参数化，达到代码重用目的
    //通过类型参数化来实现同一代码操作多种类型
    #endregion
    #region 知识点二 反省分类
    //泛型类和泛型接口
    //基本语法
    //class 类名<泛型占位符0>
    //interface 接口名<泛型占位字母>

    //泛型函数
    //基本语法:函数名<泛型占位字母>(参数列表)

    //注意：泛型占位字母可以有多个，用逗号隔开
    #endregion
    #region  知识点三 泛型类和接口
    class TextClass<T>   //T 代表参数类型 
    {
        public T value;   //泛型实现了类型参数化，达到代码重用目的
    }

    //泛型接口

    interface TextInterface<T>
    {
       T GetValue   //属性 
        {
            get;

            set;
        }
    }

    class Text :TextInterface<int>
    {
        public int GetValue
        {  get; set; }

    }
    #endregion


    #region 泛型方法
    //普通类中的泛型方法 

    class Car
    {
        public void Show<T>(T value)
        {
            Console.WriteLine(value);
        }

       
        public void Show<T>()
        {
            T t = default(T);   //做逻辑处理 
        }
        //作为返回值
        public T Show<T>(string v)
        {
            return default(T);   //返回T的默认值
            
        }
          
        public void Show<K,M,T>(K k,M m ,T t)
        {

        }
    }
    //2:泛型类中的泛型方法

    class Text2<T>
    {
        public T value;

        //泛型方法的判定

        public void TextFun(T t)    //这个不叫做泛型方法 是因为 T是泛型方法在申明的时候就指定，
        {                           //我们不能去动态的改变它
            {
                Console.WriteLine(t);
            }
        }

        public void TextFun<K>(K k)   //这个才是泛型方法
        {
            Console.WriteLine(k);
        }
    }
    #region  知识点五 泛型的作用

    //1:不同类型的相同的逻辑处理就可以使用泛型

    //2：使用泛型可以一定程度上避免装箱和拆箱  （封箱和拆箱会造成性能的损失）

    //举例 优化arraylist
    #endregion


    #endregion

    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("泛型");

            TextClass<int>  a = new TextClass<int>();
            a.value = 10;
            Console.WriteLine(a.value);

            TextClass<string> t = new TextClass<string>();
            t.value = "hello";
            Console.WriteLine(t.value);

          Car c = new Car();
          c.Show<string>("hello world!");
           

            Text2<int> t2 = new Text2<int>();
            t2.TextFun<int>(10);
            t2.TextFun<string>("hello world");

            t2.TextFun(10);   //这个不叫做泛型方法 是因为 T是泛型方法在申明的时候就指定，  

            Type q = new Type();

            q.GetInt(1);

            q.GetType(5.00);

            //Rget<int> i = new Rget<int>();
            //i.Get<int>(1);


         







        }
    }
}
